package cn.xiaolang.function.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 适用interface自定义一个注解
 * 
 * <p>
 * 
 * @Target: 说明了Annotation所修饰的对象范围：Annotation可被用于
 *          packages、types（类、接口、枚举、Annotation类型）、 类型成员（方法、构造方法、成员变量、枚举值）、
 *          方法参数和本地变量（如循环变量、catch参数）。 在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
 *          </p>
 *          <ui>
 *          <li>1.CONSTRUCTOR:用于描述构造器</li>
 *          <li>2.FIELD:用于描述域,字段</li>
 *          <li>3.LOCAL_VARIABLE:用于描述局部变量</li>
 *          <li>4.METHOD:用于描述方法</li>
 *          <li>5.PACKAGE:用于描述包</li>
 *          <li>6.PARAMETER:用于描述参数</li>
 *          <li>7.TYPE:用于描述类、接口(包括注解类型) 或enum声明</li> </ui>
 * 
 *          <p>
 * @Retention: 定义了该Annotation被保留的时间长短,某些Annotation仅出现在源代码中，而被编译器丢弃；
 *             而另一些却被编译在class文件中； 编译在class文件中的Annotation可能会被虚拟机忽略，
 *             而另一些在class被装载时将被读取（请注意并不影响class的执行，因为Annotation与class在使用上是被分离的）。
 *             使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
 *             </p>
 *             <ui>
 *             <li>1.SOURCE:在源文件中有效（即源文件保留）</li>
 *             <li>2.CLASS:在class文件中有效（即class保留）</li>
 *             <li>3.RUNTIME:在运行时有效（即运行时保留）</li>
 * 
 *             <p>
 * @Documented: 表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的.
 *              但如果声明注解时指定了Documented,则它会被 javadoc 之类的工具处理,
 *              所以注解类型信息也会被包括在生成的文档中.
 *              </p>
 * 
 *              <p>
 * @Inherited: 继承父类类上的注解
 *             </p>
 * 
 * @version 1.5
 * @author fuhw
 */
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface CustomRetention {
	// 在注解中定义一些属性
	String hello() default "xiaolang";

	String world();

	String message() default "{world()}必须有小狼";

	int[] array() default { 1, 2, 3, 4, 5 };

	@SuppressWarnings("rawtypes")
	Class style() default String.class;

}
